<?xml version="1.0" encoding="UTF-8"?>
<doc>
<title>属性(property)</title>

<para>
<ptitle>属性(property)</ptitle>
　属性可以像变量那样进行读写，但实际上，在读写时会像调用函数那样调用<kw>设置函数</kw> ( <kw>setter</kw> ) 和<kw>读取函数</kw> ( <kw>getter</kw> ) 。设置函数 和 读取函数有时也被称为 属性控制器。<r/>
<r/>
　定义格式如下。<r/>
<bq>
<kw>property</kw> 标识符<r/>
{<r/>
	setter(参数)<r/>
	{<r/>
		// 这里是设定函数的内容<r/>
	}<r/>
<r/>
	getter()<r/>
	{<r/>
		// 这里是读取函数的内容<r/>
		return 表达式; // 读取函数的返回值<r/>
	}<r/>
}<r/>
</bq>
　把 setter 和 getter 的书写顺序反过来也没问题。 <r/>
　即使在类中定义了 property 或者把属性注册为全局对象的成员，属性标识符中的值也要通过读取函数来取得，通过设置函数来设置。设置函数和读取函数和方法一样可以包含各种各样的内容。设置函数通过写在 setter 后面的 ( ) 里的参数来接受变量作为属性的值。读取函数通过 <kw>return</kw> 语句将属性的值返回。<r/>
<r/>
　getter后面的 () 可以省略。 <r/>
<r/>
　如果将对应一个标识符的设置函数和读取函数都写出来，这个标识符就成了即可读又可写的属性。如果只写出其中一个，例如只写了读取函数的时候，这个标识符就成了只读属性了，对它进行写入时会产生错误。<r/>
<example>
	var value;<r/>
<r/>
	property property1 // 声明属性 'property1' <r/>
	{<r/>
		setter(v)<r/>
		{<r/>
			// 设置函数只接受一个参数<r/>
			value=v; // 处理参数 v <r/>
<r/>
			inform("value set.");<r/>
		}<r/>
<r/>
		getter<r/>
		{<r/>
			// 声明 'property1' 的读取函数<r/>
			// 读取函数没有参数<r/>
			inform("value get.");<r/>
			return value; // 把 value 作为返回值<r/>
		}<r/>
	}<r/>
<r/>
	property1=5; // 向 property1 代入数值会调用读取函数<r/>
	property1++; // 像这样的表达式会先调用读取函数，<r/>
	             // 然后调用设置函数来设置新值。<r/>
}<r/>
</example>
　属性也和变量、函数、类一样，可以被覆盖。<r/>
</para>

<para>
<ptitle>属性对象(property object)</ptitle>
　属性本身也是一个对象。但是，无论注册到什么对象中，普通的操作方式只是会调用属性控制器，而无法对属性对象本身进行操作。<r/>
　使用 <tt><kw>&amp;</kw></tt> 运算符可以取出属性对象。取出的属性对象能够代入到局部变量中。<r/>
　还有，使用 <tt>&amp;</tt> 运算符也可以把属性对象注册到别的对象中。<r/>
<example>
	property prop // 声明属性 prop <r/>
	{<r/>
		(略)<r/>
	}<r/>
<r/>
{<r/>
	var p = &amp;prop; // 获得属性对象并将其代入到局部变量中<r/>
<r/>
	&amp;object.property1 = p; // 将 p 注册为 object 的 property1 <r/>
}<r/>
</example>
<r/>
　使用 <tt>&amp;</tt> 运算符可以不触动读取函数和设置函数，直接对属性对象本身进行操作。不使用 <tt>&amp;</tt> 运算符的话，则是对属性的普通的操作(读或写)。<r/>
<r/>
　已经被取出并变为局部变量的的属性对象，虽然没有注册到某个对象中，但是使用 <tt><kw>*</kw></tt> 运算符仍可以调用它的属性控制器。<r/>
<r/>
<example>
	property prop // 声明属性 prop <r/>
	{<r/>
		(略)<r/>
	}<r/>
<r/>
{<r/>
	var p = &amp;prop; // 获得属性对象并将其代入到局部变量中<r/>
<r/>
	*p = 30; // 调用 setter 将属性的值设定为 30 <r/>
	func(*p); // 调用 getter 获得属性的值并传入 func 函数<r/>
}<r/>
</example>
<note>
像上面那样使用 var 变量保存属性对象时，请使用局部变量。这是因为，属性对象一旦注册到某个对象中，它就不会作为属性对象，而是作为属性经由读取函数和设置函数来工作。换句话说，不作为局部变量，而是作为全局变量(＝global的成员)或者对象的成员来注册的话，它就会像普通的属性那样工作。当然，可以使用 &amp; 运算符把注册为全局变量或对象的成员的属性对象取出来。
</note>
<r/>
对属性对象使用 instanceof 运算符和 "Property" 操作数，结果为真(以上面那个为例，&amp;prop instanceof "Property" 的值为真)。<r/>
</para>
</doc>